package com.yyge.config;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * filter是一个运行中的对象，在用户请求达到servlet之前执行。
 * 过滤器中可以根据业务逻辑来决定请求是否放行；
 *   如果过滤器没有放行请求，则过滤器中直接将结果响应给客户端，请求没有达到servlet
 *   如果过滤器放行了请求，则将请求传递到下一个过滤器，如果已经没有了后续过滤器，则执行servlet
 *   当servlet响应请求时，同样也会按照过滤器的执行流程的倒序执行一次
 */
// 拦截所有的用户请求
// 按照注解配置的过滤器，按照过滤器的类名的顺序执行
public class CORS_Filter implements Filter {
    /**
     *   init,doFilter,destroy三个方法属于Filter过滤器生命周期方法
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("B_CORS_Filter： 过滤器对象被web容器初始化以后执行的方法; -------init-------");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {


        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        // 获取HTTP请求方法; GET,POST,PUT,DELETE,OPTIONS,TRACE
        String method = req.getMethod();
        System.out.println("B_CORS_Filter：method = {} 过滤器在响应头中设置允许跨域，------doFilter-------" + method);
        // 允许跨域
        //Access-Control-Allow-Origin允许哪些url地址进行访问
        resp.setHeader("Access-Control-Allow-Origin", "*"); // 允许任意前端程序访问
        // 多长时间内不用再发起第二次预检的请求,单位秒
        resp.setHeader("Access-Control-Max-Age", "1800");
        // 告诉客户端，服务器支持的请求方法
        resp.setHeader("Access-Control-Allow-methods", "*");
        // 服务器允许客户端自定义的请求头参数
        resp.setHeader("Access-Control-Allow-Headers", "*");
        // 是否允许客户端缓存数据
        resp.setHeader("Access-Control-Allow-Credentials", "false");
        // 如果放行请求，则执行chain中的方法
        // 如果不放行请求，则执行响应，不要执行chain的方法
        chain.doFilter(request,response);// 进入下一个过滤器或者servlet
        System.out.println("B_CORS_Filter: 过滤器响应客户端请求");
    }

    @Override
    public void destroy() {
        // 服务器重启，关闭时执行过滤器的销毁方法
        System.out.println("B_CORS_Filter: 执行销毁方法，------destroy-----");
    }
}
